package com.yunhe.abnormal.service.base;

import com.yunhe.abnormal.domain.base.AlarmCalculation;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.model.base.AlarmRuleInstanceDTO;

import java.util.List;
import java.util.Map;

/**
 * 异常规则实例Service
 * @author liuronglei
 */
public interface AlarmRuleInstanceService {

    /**
     * 新增异常规则实例对象
     * @param alarmRuleInstance 异常规则实例对象
     */
    AlarmRuleInstanceDTO create(AlarmRuleInstanceDTO alarmRuleInstance);

    /**
     * 批量新增异常规则实例对象
     * @param alarmRuleInstances 异常规则实例对象列表
     */
    List<AlarmRuleInstanceDTO> create(List<AlarmRuleInstanceDTO> alarmRuleInstances);

    /**
     * 根据ID获得异常规则实例对象
     * @param id 对象ID
     */
    AlarmRuleInstanceDTO findById(Long id);

    /**
     * 根据ID批量获得异常规则实例对象
     * @param ids 对象ID
     */
    List<AlarmRuleInstanceDTO> findByIds(List<Long> ids);

    /**
     * 根据ID删除异常规则实例对象
     * @param id 对象ID
     */
    void deleteById(Long id);

    /**
     * 更新异常规则实例对象
     * @param alarmRuleInstance 异常规则实例
     */
    AlarmRuleInstanceDTO update(AlarmRuleInstanceDTO alarmRuleInstance) throws ObjectNotFoundException;

    /**
     * 更新异常规则实例对象
     * @param alarmRuleInstances 异常规则实例
     */
    List<AlarmRuleInstanceDTO> update(List<AlarmRuleInstanceDTO> alarmRuleInstances);

    /**
     * 根据ID列表批量删除异常规则实例对象
     * @param ids 对象ID列表
     */
    void batchDelete(List<Long> ids);

    /**
     * 根据异常规则ID批量删除异常规则实例对象
     * @param alarmRuleId 异常规则ID
     */
    void deleteByRuleId(Long alarmRuleId);

    /**
     * 根据异常规则ID批量删除异常规则实例对象
     * @param alarmRuleIds 异常规则ID列表
     */
    void deleteByRuleId(List<Long> alarmRuleIds);

    /**
     * 根据电站ID删除异常规则实例
     * @param stationIds 电站ID
     */
    void deleteByStationId(List<Long> stationIds);

    /**
     * 根据设备ID删除异常规则实例
     * @param deviceIds 设备ID
     */
    void deleteByDeviceId(List<Long> deviceIds);

    /**
     * 根据异常规则更新实例
     * @param alarmRuleId 异常规则ID
     * @param alarmRuleInstances 替换后的实例列表
     */
    void updateByRule(Long alarmRuleId, List<AlarmRuleInstanceDTO> alarmRuleInstances) throws ObjectNotFoundException;

    /**
     * 根据电站ID或代码获得异常规则实例
     * @param stationId 电站ID
     * @param stationCode 电站代码
     */
    List<AlarmCalculation> getCalculationByStation(Long stationId, Long stationCode);

    /**
     * 根据电站代码获得点号和异常规则实例的映射
     * @param stationCode 电站代码
     */
    Map<Long, List<AlarmCalculation>> getPointCalculationMapByStationCode(Long stationCode);

    /**
     * 根据电站ID获得点号和异常规则实例的映射
     * @param stationId 电站ID
     */
    Map<Long, List<AlarmCalculation>> getPointCalculationMapByStationId(Long stationId);

    /**
     * 获得电站的异常规则实例列表
     * @param stationId 电站ID
     */
    List<AlarmRuleInstanceDTO> findAlarmRuleInstanceForStation(Long stationId);

    /**
     * 获得设备的异常规则实例列表
     * @param deviceId 设备ID
     */
    List<AlarmRuleInstanceDTO> findAlarmRuleInstanceForDevice(Long deviceId);

    /**
     * 根据电站ID获得异常规则实例列表
     * @param stationId
     * @return
     */
    List<AlarmRuleInstanceDTO> findByStationId(Long stationId);

    Long getMaxAlarmVirtualPid(Long stationCode);

    List<AlarmRuleInstanceDTO> findByVirtualPointIds(List<Long> virtualPids);

    List<AlarmCalculation> getCalculationByInstanceIds(List<Long> instanceIds);
}
